#lang racket

(define (dec n)
  (- n 1)
  )

(define (! n)
  (cond
    [(zero?  n) 0]
    [(= n 1) 1]
    [else (* n (! (dec n)))])
  )

(define (produce-from-20 n)
  (cond
    [(<= n 20) 0]
    [else (/ (! n) (! 20))])
  )

(define (produce-from-m-n m n)
  (cond
    [(> m n) 0]
    [(= m n) 1]
    [else (* n (produce-from-m-n m (dec n)))])
  )

; Test
(! 5)
(produce-from-20 25)
(produce-from-m-n 20 25)